#include "Light.h"
#define  LIGHT_MAX  255
s_lightlist         Light_List[LIGHT_MAX];
s_lightlist         *ListHead;                          //灯列表头
s_lightlist         *emptyList;                         //空列表
s_lightlist         *light_scan_cur=NULL;               //当前扫描灯
s_lightlist         *light_scan_last=NULL;              //上一个扫描灯
uint8_t             scan_cnt=0;                         //扫描次数计数
//********************************************************
// 灯列表初始化
//********************************************************
void light_list_init(void)
{
   uint8_t list_id=0;

  //--将数组以链表形式
   for(list_id=0;list_id<LIGHT_MAX;list_id++)
   {
      memset(Light_List+list_id,0,sizeof(s_lightlist));
      if(list_id!=(LIGHT_MAX-1))
        Light_List[list_id].next = &(Light_List[list_id+1]);
   }

   ListHead     = NULL;                                    //灯列表指针
   emptyList    = Light_List;                              //空列表指针
}

//********************************************************
// 添加灯
// 返回：0 成功    1 内存不足
//********************************************************
s_lightlist* add_light(s_light* light)
{
  s_lightlist* light_list_cur=NULL;
  light_list_cur = ListHead;

  //-- 从空列表分配空间
  light_list_cur = emptyList;                              //分配空间
  if(light_list_cur==NULL)                                 //空间不足
  {
    return NULL;
  }
  else
  {
    emptyList = emptyList->next;
    memcpy(&(light_list_cur->light), light,3);
    light_list_cur->scanCnt    = 0;
    light_list_cur->receiveCnt = 0;
  }

  //-- 将灯添加到列表

  light_list_cur->next = ListHead;
  ListHead             = light_list_cur;

  return light_list_cur;
}
//********************************************************
// 在列表内查找灯
// 返回：NULL 没有查到 
//********************************************************
s_lightlist* find_light(s_light* light)
{
  s_lightlist* light_list=ListHead;
  while(light_list != NULL)                             //灯列表
  {
    if(0==memcmp(&(light_list->light), light, 3))       //仅对比灯id
    {
      return light_list;
    }
    light_list = light_list->next;
  }
  return NULL;
}
//********************************************************
// 从列表中删除计数小于level的灯
//********************************************************
void remove_light(s_lightlist* LastlightItem, s_lightlist* lightItem)
{
  if((LastlightItem==NULL) ||(LastlightItem==lightItem))  //当前节点是头
  {
    ListHead        = NULL;
    lightItem->next = emptyList;
    emptyList       = lightItem;
    light_scan_last = NULL;
    light_scan_cur  = NULL;
  }
  else                                                    //当前节点不是头节点
  {
    LastlightItem->next = lightItem->next;
    lightItem->next     = emptyList;
    emptyList           = lightItem;
  }
}

//********************************************************
// 获取下一个灯
//********************************************************
s_lightlist* get_next_light( )
{
  if(ListHead==NULL)
  {
     return NULL;
  }

  if(light_scan_cur!=NULL)
  {
    if(light_scan_cur->scanCnt>=20)                         //灯扫描20次进行接收计数判断
    {
      if( light_scan_cur->receiveCnt<=1)                    //没有接收到灯
      {
        remove_light(light_scan_last,light_scan_cur);
        if(light_scan_last!=NULL)
        {
          light_scan_cur = light_scan_last->next;
        } 
      }
      else
      {
        light_scan_cur->scanCnt=0;
        light_scan_cur->receiveCnt=0;
      } 
    }
    else
    {
      light_scan_cur->scanCnt++;
      light_scan_last = light_scan_cur;
      light_scan_cur  = light_scan_cur->next;
    }
  }

  if(light_scan_cur==NULL)
  {
    light_scan_cur = ListHead;
  }
  
  return light_scan_cur;
}

//********************************************************
// 判断是不是列表头
//********************************************************
bool is_list_head(s_lightlist* light)
{
   return (light==ListHead);
}
